# Adogs
# 时间: 2021/7/16 16:12
import pygame
import enum
class WalkDir(enum.IntEnum):
    """
    行走的方向类
    用枚举类型来存储行走方向
    """
    down=0
    left=1
    right=2
    on=3
class WalkByImage:
    """
    行走图片类
    用于分割只有行走动作的人物图片
    方法：
    1.__init__(path_name,image_wide,image_high,is_loop)
    2.get_image()
    3.set_dir(dir)
    4.is_end()
    """
    image_count=16  # 设置人物的行走图片数量
    image_col=4 # 图片列数
    image_wide=49   # 人物宽度
    image_high=74   # 人物高度
    walk_dir=WalkDir.down   # 将人物方向初始化为向下的
    def __init__(self,path_name:str,image_wide:int,image_high:int,is_loop:bool):
        """
        :param path_name: 图片路径
        :param image_wide:人物宽度
        :param image_high:人物高度
        :param is_loop:人物行走图片是否循环播放
        """
        self.path_name=path_name
        self.image_index=0
        self.action_image=[]
        self.image_high=image_high
        self.image_wide=image_wide
        self.is_loop=is_loop
        self.image=pygame.image.load(path_name)
        for i in range(0,self.image_count):     # 将图片按照人物行走方向来分割，并存储到self.action_image中
            row=int(i/self.image_col)
            col=i%self.image_col
            if col==0:
                dir=[]
                self.action_image.append(dir)
            rect=(col*self.image_wide,row*self.image_high,self.image_wide,self.image_high)
            image=self.image.subsurface(rect)
            dir.append(image)
    def get_image(self, run_flag)->pygame.image:
        """
        查找当前播放的图片
        :param run_flag: 判断图片是否循环播放
        :return: 当前图片
        """
        if run_flag:
            current_image = self.action_image[self.walk_dir][self.image_index]
            self.image_index += 1
            if self.image_index >= self.image_col:
                if self.is_loop:
                    self.image_index = 0
                else:
                    self.image_index = self.image_col - 1
        else:
            current_image = self.action_image[self.walk_dir][0]
        return current_image
    def set_dir(self,dir:WalkDir):
        """
        设置人物方向
        :param dir:四个方向（down，right，left，on）
        :return:无返回值
        """
        self.walk_dir=dir
    def is_end(self)->bool:
        """
        判断人物图片是否播放完毕
        :return:True or False
        """
        if self.is_loop:
            return False
        else:
            if self.image_index==self.image_col-1:
                return True
            else:
                return False
class ShootDir(enum.IntEnum):
    """
    人物射击方向类
    用枚举类型来存储射击方向
    """
    not_shoot=0
    left_down=1
    right_down=2
    left_up=3
    right_up=4
    up=5
    down=6
class DirShootByImage(WalkByImage):
    """
    射击图片类
    用于分割具有射击动作的人物图片
    方法：
    1.__init__(path_name,image_wide,image_high,is_loop)
    2.get_image()
    3，set_dir(dir)
    """
    image_count=16  # 图片数量
    image_col = 4   # 图片列数
    image_wide = 49     # 人物宽度
    image_high = 74     # 人物高度
    shoot_dir=ShootDir.left_up  # 射击人物方向初始化为左侧站立射击
    @staticmethod   # 可以使静态方法无需实例化直接使用
    def __init_shoot(up_image_path,down_iamge_path):
        """
        初始化射击函数
        :param up_image_path:人物站立射击图片路径
        :param down_iamge_path:人物蹲姿射击图片路径
        :return:无返回值
        """
        DirShootByImage.up_shoot_image=pygame.image.load(up_image_path).convert_alpha()
        DirShootByImage.down_shoot_image=pygame.image.load(down_iamge_path).convert_alpha()
    def __init__(self,path_name:str,image_wide:int,image_high:int,is_loop:bool):
        """
        初始化函数
        :param path_name:图片路径
        :param image_wide:人物宽度
        :param image_high:人物高度
        :param is_loop:是否循环播放
        """
        super(DirShootByImage, self).__init__(path_name,image_wide,image_high,is_loop)  #调用基类函数
        self.__init_shoot("./resources/picture/shoot/up_shoot.png","./resources/picture/shoot/down_shoot.png")

    def get_image(self) ->pygame.Surface:
        """
        获取当前播放图片
        :return: 当前播放图片
        """
        if self.shoot_dir==ShootDir.not_shoot:
            return None
        if self.shoot_dir<ShootDir.up:
            current_img=self.action_image[self.shoot_dir-1][self.image_index]   #因为没有not_shoot类型的图片，所以要减去1
            self.image_index+=1
            if self.image_index>=self.image_col:
                if self.is_loop:
                    self.image_index=0
                else:
                    self.image_index=self.image_col-1
        elif self.shoot_dir==ShootDir.up:
            current_img=DirShootByImage.up_shoot_image
        else:
            current_img=DirShootByImage.down_shoot_image
        return current_img
    def set_dir(self,dir:ShootDir):
        """
        设置射击方向
        :param dir:6个射击方向
        :return:无返回值
        """
        self.shoot_dir=dir

